<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // var name test  以后避开这两个名字 防止引起不必要的错误
        // 核心是 子类的原型直接指向父类的原型 
        // function Person(name,age){
        //     this.name = name;
        //     this.age = age;
        // }

        // Person.prototype.sayHello = function(){
        //     console.log('hello world');
        // }

        // function Third(){
            
        // }

        // Third.prototype = Person.prototype;
     
        // function Student(gender,...args){
        //     this.gender = gender;
        //     Person.call(this,...args)
        // }


        // Student.prototype = new Third();
        // Student.prototype.study = function(){
        //     console.log('9999999');
        // }

        // const s1 = new Student('男','张三',18);

        // console.log(s1);
        // s1.sayHello();
       

        // 子类没有自己的原型了 直接使用父类的原型 
        // 造成一个问题 
        // 修改子类的原型  父类的原型也跟着改变
        // 如何解决  
        // 借用一个第三方构造函数  它负责用寄生继承的方式 
        // 去继承父类  

        // 然后第三方的实例 给到子类的原型 
        // 好处是 修改子类的原型 不再影响父类原型  
        // 寄生继承的优化  


        // 上面子类的构造函数 和原型暴露在 全局作用域中 
        //容易被污染 


        // 如何防止杯被污染 
        // 把子类的构造函数和原型放到一个盒子中 让用户用这个盒子解决问题 
        // 不需要管盒子里边是什么  

      

        // function fuxiang(){
        //     console.log(6666);
        // }

        // fuxiang()


          // 自执行函数  打开页面自动调用 不需要手动调用 

        // (function(){
        //     var a = 100;
        //     console.log(666888777);
        // })()

        
        // (function(num1,num2){
        //     var res = num1+num2;
        //     console.log(res);
        // })(100,200)


      //寄生继承最终版  


        function Person(name,age){
            this.name = name;
            this.age = age;
        }

        Person.prototype.sayHello = function(){
            console.log('hello world');
        }


        const newStudent = (function(){
            function Student(gender,...args){
            this.gender = gender;
            Person.call(this,...args)
            }
         function Third(){}

         Third.prototype = Person.prototype;
         Student.prototype = new Third();

         // 子类拥有自己的原型 
        //  Student.prototype.constructor = Student

         Student.prototype.study = function(){
            console.log(6666);
         }
         return Student

        })();


        // 实例化对象 

        const s1 = new newStudent('男','张三',18);
        console.log(s1);

        // 解决问题 
        // 1 修改子类的原型 不再影响父类的原型  
        // 2 子类的构造函数  和原型放到 自执行函数中  不再被污染  
    </script>
</body>
</html>